package design_pattern.trigger.frame;

import java.util.Observable;

/**
 * 产品具体事件 继承 主题 Observable
 * <p>
 * Observable 需要单独了解下
 */
public class ProductEvent extends Observable {
    // 事件起源
    private Product source;
    // 事件的类型： 类似就是事件改变类型： 也就是事件注册者
    private ProductEventType type;

    // 传入事件的源头，默认为新建类型
    public ProductEvent(Product product) {
        // this.ProductEvent(product, ProductEventType.NEW_PRODUCT);
        this(product, ProductEventType.NEW_PRODUCT);
    }

    /**
     * 产品事件的构造器
     * 产生事件之后，交给事件分发中心
     */
    public ProductEvent(Product product, ProductEventType type) {
        this.source = product;//产品就是事件源
        this.type = type;
        // 交给事件分发中心
        notifyEventDispatch();
    }

    // 获得事件的始作俑者
    public Product getSource() {
        return source;
    }

    // 获得事件的类型
    public ProductEventType getEventType() {
        return this.type;
    }

    /**
     * 交给事件分发中心，
     * 由事件分发中心来处理事件
     * 这里使用订阅模式，ProductEvent是订阅者订阅的事件
     */
    private void notifyEventDispatch() {
        // 观察者就是事件类型 : 通过事件分发者：（中介者模式）
        super.addObserver(EventDispatch.getDispatch());

        // 是否修改，修改是通知观察者的一个前提条件
        super.setChanged();

        // 通知观察者，即通知所有注册到Observers的客户端，客户端会触发update方法
        super.notifyObservers(source);

        // update是交给观察者自己去实现的
    }

}

